﻿#pragma once

#include "CorrespondHeader.h"
#include "GlobalInfoManager.h"
#include "InitParameter.h"

//////////////////////////////////////////////////////////////////////////////////
// 数据定义

// 服务类型
enum enServiceKind {
  ServiceKind_None,  // 无效服务
  ServiceKind_Game,  // 游戏服务
  ServiceKind_Plaza, // 广场服务
  ServiceKind_Chat,  // 好友服务
};

// 绑定参数
struct tagBindParameter {
  // 网络数据
  DWORD dwSocketID;    // 网络标识
  DWORD dwClientAddr;  // 连接地址
  time_t dwActiveTime; // 激活时间

  // 附加数据
  WORD wServiceID;           // 服务标识
  enServiceKind ServiceKind; // 服务类型
};

//////////////////////////////////////////////////////////////////////////////////

// 调度钩子
class CDispatchEngineSink : public IDispatchEngineSink {
  // 友元定义
  friend class CServiceUnits;

  // 状态变量
protected:
  WORD collect_item_ = INVALID_WORD;        // 汇总连接
  std::vector<WORD> wait_collect_item_array_; // 汇总等待

  // 变量定义
protected:
  CInitParameter* init_parameter_ = nullptr;   // 配置参数
  tagBindParameter* bind_parameter_ = nullptr; // 辅助数组

  // 组件变量
protected:
  CGlobalInfoManager global_info_manager_; // 全局管理

  // 组件接口
protected:
  ITimerEngine* timer_engine_ = nullptr;           // 时间引擎
  ITCPNetworkEngine* network_engine_ = nullptr; // 网络引擎

  // 函数定义
public:
  // 构造函数
  CDispatchEngineSink() = default;
  // 析构函数
  virtual ~CDispatchEngineSink() = default;

  // 基础接口
public:
  // 释放对象
  virtual VOID Release() {}
  // 接口查询
  virtual VOID* QueryInterface(REFGUID Guid, DWORD dwQueryVer);

  // 异步接口
public:
  // 启动事件
  virtual bool OnAttemperEngineStart(IUnknownEx* pIUnknownEx);
  // 停止事件
  virtual bool OnAttemperEngineConclude(IUnknownEx* pIUnknownEx);

  // 事件接口
public:
  // 控制事件
  virtual bool OnEventControl(WORD wIdentifier, VOID* pData, WORD wDataSize);
  // 自定事件
  virtual bool OnEventAttemperData(WORD wRequestID, VOID* pData, WORD wDataSize);

  // 内核事件
public:
  // 时间事件
  virtual bool OnEventTimer(DWORD dwTimerID, WPARAM wBindParam);
  // 数据库事件
  virtual bool OnEventDatabaseResult(WORD wRequestID, DWORD dwContextID, VOID* pData, WORD wDataSize);

  // 连接事件
public:
  // 连接事件
  virtual bool OnEventTCPSocketLink(WORD wServiceID, INT nErrorCode);
  // 关闭事件
  virtual bool OnEventTCPSocketShut(WORD wServiceID, BYTE cbShutReason);
  // 读取事件
  virtual bool OnEventTCPSocketRead(WORD wServiceID, TCP_Command Command, VOID* pData, WORD wDataSize);

  // 网络事件
public:
  // 应答事件
  virtual bool OnEventTCPNetworkBind(DWORD dwSocketID, DWORD dwClientAddr);
  // 关闭事件
  virtual bool OnEventTCPNetworkShut(DWORD dwSocketID, DWORD dwClientAddr, DWORD dwActiveTime);
  // 读取事件
  virtual bool OnEventTCPNetworkRead(DWORD dwSocketID, TCP_Command Command, VOID* pData, WORD wDataSize);

  // 网络事件
protected:
  // 注册服务
  bool OnTCPNetworkMainRegister(WORD wSubCmdID, VOID* pData, WORD wDataSize, DWORD dwSocketID);
  // 服务状态
  bool OnTCPNetworkMainServiceInfo(WORD wSubCmdID, VOID* pData, WORD wDataSize, DWORD dwSocketID);
  // 用户汇总
  bool OnTCPNetworkMainUserCollect(WORD wSubCmdID, VOID* pData, WORD wDataSize, DWORD dwSocketID);
  // 远程服务
  bool OnTCPNetworkMainRemoteService(WORD wSubCmdID, VOID* pData, WORD wDataSize, DWORD dwSocketID);
  // 管理服务
  bool OnTCPNetworkMainManagerService(WORD wSubCmdID, VOID* pData, WORD wDataSize, DWORD dwSocketID);
  // 机器服务
  bool OnTCPNetworkMainAndroidService(WORD wSubCmdID, VOID* pData, WORD wDataSize, DWORD dwSocketID);

  // 辅助函数
protected:
  // 发送列表
  bool SendServerListItem(DWORD dwSocketID);
  // 发送列表
  bool SendMatchListItem(DWORD dwSocketID);
  // 数据发送
protected:
  // 房间发送
  bool SendDataToGame(WORD wServerID, WORD wMainCmdID, WORD wSubCmdID, VOID* pData, WORD wDataSize);
  // 用户发送
  bool SendDataToUser(WORD wServerID, DWORD dwUserID, WORD wMainCmdID, WORD wSubCmdID, VOID* pData, WORD wDataSize);
};

//////////////////////////////////////////////////////////////////////////////////
